package 类与对象.多态;
/*
    对象的多态：
    1.一个对象的编译类型和运行类型可以不一致
    2.编译类型在定义对象时，就确定了，不能改变
    3.运行类型是可以变的
    4.编译类型看定义时 = 号的 左边，运行类型看 = 号的 右边

    例子:
        Animal animal = new Dog(); animal 编译类型是Animal 运行类型Dog
        animal = new Cat(); animal的运行类型变成了Cat，编译类型任然是Animal
    多态的前提是：两个对象(类)存在继承关系
    多态的向上转型
        a. 本质：父类的引用指向了子类的对象
        b.语法：父类类型  应用名 = new 子类类型();
        c.特点：编译类型看左边，运行类型看右边
            可以调用父类中的所有成员(需要遵守访问权限)
            不能调用子类中特有成员
                原因：因为在编译阶段，能调用那些成员，是由编译器来决定的
            最终运行效果看子类的具体实现
    多态的向下转型：
    1.语法：子类类型 引用名 = (子类类型) 父类引用;
    2.只能强转父类的引用，不能强转父类的对象，要求父类的引用必须指向的是当前目标类型的对象
    3.可以调用子类类型的中的所有成员

    属性的值要看编译类型

    instanceof：判断对象的运行类型是否为xx类型或者xx类型的子类型

    动态绑定：
        1.当调用对象方法的时候，该方法会和改对象的内存地址/运行类型绑定
        2.当调用对象属性时，没有动态绑定机制，哪里声明，哪里使用
 */
public class 多态 {
    public static void main(String[] args) {
        Master tom = new Master();
        Dog dog = new Dog("大黄");
        Fish fish = new Fish("香蕉");
//        dog.run();
        tom.feed(dog, fish);

        Cat cat = new Cat("猫咪");
        Fish fish1 = new Fish("鱼");
        tom.feed(cat, fish1);
    }
}
